/** 
* Projet AP5 - Agenda PDA
* DateDisplayed.java
*/

package pda.view;

import java.util.GregorianCalendar;
import java.util.Calendar;


/**
* Classe qui gere la date avec les années bisextiles */

public  class DateDisplayed{


//##########################################################################################################
//										Attribut 
//##########################################################################################################

	/** Tableau de chaine de caractère contenant les jours de la semaine */
	private String[] dayName = {"","Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"};
	

//##########################################################################################################
//										Constructeur 
//##########################################################################################################

	/**
	* Le Constructeur de la classe */
	public DateDisplayed(){}
	
	
//##########################################################################################################
//										Methodes 
//##########################################################################################################

	/**
	*retire un jour a une date donnee
	*@param date la date donnee
	*@return la nouvelle date
	*/
	public String changeSubDay(String date){
		//recupere le mois 
		String[] tmpp = date.split(" ");
		String[] tmp = tmpp[1].split("/");// xx/xx/xxxx
		String day = "";

		int month = Integer.parseInt(tmp[1]);

		
		if (  (month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && ( Integer.parseInt(tmp[0])-1 == 0)){
			tmp[0] = String.valueOf(30);
			tmp[1] = String.valueOf(Integer.parseInt(tmp[1])-1);
			
		}else if ( (month == 2 || month == 4 || month == 6 || month == 9 || month == 11 ) && ( Integer.parseInt(tmp[0])-1 == 0)){//changement de mois
			tmp[0] = String.valueOf(31);
			tmp[1] = String.valueOf(Integer.parseInt(tmp[1])-1);
		} else if (month == 1 && Integer.parseInt(tmp[0])-1 == 0){//changement d'annee
			tmp[0] = String.valueOf(31) ;
			tmp[1] = String.valueOf(12) ;
			tmp[2] = String.valueOf(Integer.parseInt(tmp[2])-1);
		}else if (month == 3 && (new GregorianCalendar().isLeapYear(Integer.parseInt(tmp[2]))) && Integer.parseInt(tmp[0])-1 == 0){
			tmp[0] = String.valueOf(29) ;
			tmp[1] = String.valueOf(2) ;
		}else if (month == 3 && !(new GregorianCalendar().isLeapYear(Integer.parseInt(tmp[2]))) && Integer.parseInt(tmp[0])-1 == 0){
			tmp[0] = String.valueOf(28) ;
			tmp[1] = String.valueOf(2) ;
		}else {
			tmp[0] = String.valueOf(Integer.parseInt(tmp[0])-1);
		}

		int dayOf = (new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(tmp[1])-1,Integer.parseInt(tmp[0])).get(Calendar.DAY_OF_WEEK));
		//enregistre la modification dans la variable de date selectionne
		
	
		return  dayName[dayOf]+" "+tmp[0]+"/"+tmp[1]+"/"+tmp[2] ;
	}		
	

	/**
	*ajoute un jour a une date donnee
	*@param date la date donnee
	*@return la nouvelle date
	*/
	public String changeAddDay(String date){
		//recupere le mois 
		String[] tmp = date.split(" ")[1].split("/");// xx/xx/xxxx

		int month = Integer.parseInt(tmp[1]);
		
		if (  (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10) && ( Integer.parseInt(tmp[0])%31 == 0)){
			tmp[0] = String.valueOf(1);
			tmp[1] = String.valueOf(Integer.parseInt(tmp[1])+1);
		}else if ( (month == 4 || month == 6 || month == 9 || month == 11)  && ( Integer.parseInt(tmp[0])%30 == 0)){//changement de mois
			tmp[0] = String.valueOf(1);
			tmp[1] = String.valueOf(Integer.parseInt(tmp[1])+1);
		} else if (month == 12 && Integer.parseInt(tmp[0])%31 == 0){//changement d'annee
			tmp[0] = String.valueOf(1) ;
			tmp[1] = String.valueOf(1) ;
			tmp[2] = String.valueOf(Integer.parseInt(tmp[2])+1);
		} else if (month == 2 && (new GregorianCalendar().isLeapYear(Integer.parseInt(tmp[2]))) && Integer.parseInt(tmp[0])%29 == 0){
			tmp[0] = String.valueOf(1) ;
			tmp[1] = String.valueOf(3) ;
		}else if (month == 2 && !(new GregorianCalendar().isLeapYear(Integer.parseInt(tmp[2]))) && Integer.parseInt(tmp[0])%28 == 0){
			tmp[0] = String.valueOf(1) ;
			tmp[1] = String.valueOf(3) ;
		}else {
			tmp[0] = String.valueOf(Integer.parseInt(tmp[0])+1);
		}
		
		int dayOf = (new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(tmp[1])-1,Integer.parseInt(tmp[0])).get(Calendar.DAY_OF_WEEK));
		
		//enregistre la modification dans la variable de date selectionne
		
		return dayName[dayOf]+" "+tmp[0]+"/"+tmp[1]+"/"+tmp[2] ;
				
	}
	
	/**
	*ajoute un mois a une date donnee
	*@param date la date donnee
	*@return la nouvelle date
	*/
	public String changeAddMonth(String date){
		//recupere le mois 
		String[] tmp = date.split("/");
		String[] tmp2 = tmp[0].split(" ");
		String month = "";
		//ajoute 1 a la valeur du moi 
		int val = Integer.parseInt(tmp[1])+1;
		//une annee ne compte que 12 mois donc ajout d'une annee et retour a 0 si depassement
		//sinon mois + 1 
		if ( (val%13) == 0){
			month = "1";
			tmp[2] = String.valueOf(Integer.parseInt(tmp[2])+1);
		}else{
			month = String.valueOf(val);
		}
		
		GregorianCalendar calendar = new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(month)-1,Integer.parseInt(tmp2[1]));
		
		int numberOfDayInMonth = (month == "1" || month == "3" || month == "5" || month == "7" || month == "8" || month == "10" || month == "12")?31:(month == "2" && calendar.isLeapYear(Integer.parseInt(tmp[2])))?29 : (month == "2" && !calendar.isLeapYear(Integer.parseInt(tmp[2])))?28:30;
		
		if( Integer.parseInt(tmp2[1]) > numberOfDayInMonth){
				tmp2[1] = String.valueOf(numberOfDayInMonth);
		}
		
		int dayOf = ( new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(month)-1,Integer.parseInt(tmp2[1])).get(Calendar.DAY_OF_WEEK));
	//enregistre la modification dans la variable de date selectionne
		date = dayName[dayOf]+" "+tmp2[1]+"/"+month+"/"+tmp[2];
		//init Home pour actualiser la date afficher
		return date;
		
	}
	
	
	/**
	*ajoute un jour a une date donnee
	*@param date la date donnee
	*@return la nouvelle date
	*/
	public String changeSubMonth(String date){
		//commentaire cf changeAddMonth
		String[] tmp = date.split("/");
		String[] tmpp = tmp[0].split(" ");
		String month = "";
		int val = Integer.parseInt(tmp[1])-1;
		if ( val == 0){
			month = "12";
			tmp[2] = String.valueOf(Integer.parseInt(tmp[2])-1);
		}else{
			month = String.valueOf(val);
		}
		
		GregorianCalendar calendar = new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(month)-1,Integer.parseInt(tmpp[1]));
		
		int numberOfDayInMonth = (month == "1" || month == "3" || month == "5" || month == "7" || month == "8" || month == "10" || month == "12")?31:(month == "2" && calendar.isLeapYear(Integer.parseInt(tmp[2])))?29 : (month == "2" && !calendar.isLeapYear(Integer.parseInt(tmp[2])))?28:30;
		
		if( Integer.parseInt(tmpp[1]) > numberOfDayInMonth){
				tmpp[1] = String.valueOf(numberOfDayInMonth);
		}
		
		int dayOf = (new GregorianCalendar(Integer.parseInt(tmp[2]),Integer.parseInt(month),Integer.parseInt(tmpp[1])).get(Calendar.DAY_OF_WEEK));
	
	
		return dayName[dayOf-1]+" "+tmpp[1]+"/"+month+"/"+tmp[2];

	}
	
	
	
}